{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这一节本来是要介绍Logistic回归的贝叶斯估计的，但由于其后验概率分布无法显式求解（包含了无数个sigmoid函数的乘积），所以这一节作为前提先介绍另一种对后验概率分布的近似方法：**拉普拉斯近似**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 一.一维推导\n",
    "我们知道随着观测数据的越来越多，它的后验概率分布往往会越来越尖，且根据大数定理，它往往会越来越近似于一个高斯分布，而拉普拉斯近似的基本想法便是利用一个高斯分布去近似后验概率分布，它需要两个量去描述，一个是众数，即概率密度最大值对应的变量，另一个是控制“尖”的程度，这刚好对应于高斯分布的这两个参数：**均值**和**协方差矩阵**，那如何求解呢？   \n",
    "\n",
    "（1）我们知道高斯概率分布中的均值所对应是最大值，它的必要条件是偏导数为0；   \n",
    "\n",
    "（2）协方差矩阵可以通过二阶泰勒展开来来近似；    \n",
    "\n",
    "下面以一维连续变量$z$的情形来做推导，我们假设目标分布$p(z)$的一般定义为：   \n",
    "\n",
    "$$\n",
    "p(z)=\\frac{1}{Z}f(z)\n",
    "$$  \n",
    "\n",
    "这里的$Z=\\int f(z)dz$是归一化系数。我们的目的是寻找一个高斯分布$q(z)$去近似$p(z)$，根据均值的性质，可以通过如下方程求解：   \n",
    "\n",
    "$$\n",
    "\\frac{df(z)}{dz}\\bigg |_{z=z_0}=0\n",
    "$$  \n",
    "\n",
    "我们在$z_0$处对$ln f(z)$做二阶泰勒展开有：   \n",
    "\n",
    "$$\n",
    "    ln\\ f(z)\\simeq \\ln\\ f(z_0)-\\frac{1}{2}A(z-z_0)^2\n",
    "$$   \n",
    "\n",
    "这里，$A=-\\frac{d^2}{dz^2}ln\\ f(z)\\bigg|_{z=z_0}$，两侧取指数，我们有：   \n",
    "$$\n",
    "f(z)\\simeq f(z_0)exp\\left\\{-\\frac{A}{2}(z-z_0)^2\\right\\}\n",
    "$$  \n",
    "\n",
    "对其归一化后可以得到：   \n",
    "\n",
    "$$\n",
    "q(z)=(\\frac{A}{2\\pi})^{\\frac{1}{2}}exp\\left\\{-\\frac{A}{2}(z-z_0)^2\\right\\}\n",
    "$$  \n",
    "\n",
    "**注意**：只有$A>0$才有意义（开口朝下），如果你发现$A<0$可能需要检查一下$f(z)$的计算是否正确"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 二.高维推广\n",
    "\n",
    "对于高维的情况，推导和一维类似，就直接写结果了   \n",
    "\n",
    "$$\n",
    "q(z)=\\frac{|A|^{\\frac{1}{2}}}{(2\\pi)^{\\frac{M}{2}}}exp\\left\\{-\\frac{1}{2}(z-z_0)^TA(z-z_0)\\right\\}=N(z\\mid z_0,A^{-1})\n",
    "$$  \n",
    "\n",
    "这里，$z_0$为均值点（本质是求众数点），$A$是$\\ln f(z)$在$z_0$处的Hessian矩阵，$|A|$是$A$的行列式"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 三.讨论\n",
    "\n",
    "（1）对于多峰的情况，即偏导数为0的点有多个时，可以选择使得$f(z)$取值最大的点；   \n",
    "\n",
    "（2）拉普拉斯近似的缺陷也很明显，它无法很好地近似多峰的情况；   \n",
    "\n",
    "（3）另外注意下的就是$Z$并不是关于$z$的函数（而是关于$f$的函数），所以我们并不需要关心它的值是多少，求解时按照常数处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
